; ASSEMBLY LANGUAGE LISTING›; BY CHRIS CHABRIS›; ANTIC MAGAZINE›››       ORG  $6000 ›;These subroutines are all relocatable›;Routines to scroll display, callable›;from BASIC as follows:›;   Q=USR(ADR(SCRP$),OFS) or›;   Q=USR(ADR(SCRN$),-OFS)›;Where: OFS is the offset value››OFS    EQU  $00CB   ;Storage of offset›                    ;to scroll display›DL4    EQU  $0604   ;Fourth byte of›                    ;display list›                    ;(address lobyte)›››SCRP   PLA          ;This scrolls with›                    ;a positive offset›                    ;value›       PLA›       PLA›       STA  OFS     ;Keep offset for›                    ;later use›       LDX  #00     ;In BASIC,›                    ;"FOR L=0..."›                    ;initialize index›LOOP1  LDA  DL4,X   ;Get lobyte of›                    ;LMS address›       CLC›       ADC  OFS     ;Add the offset›       STA  DL4,X   ;And replace with›                    ;the new value›       BCC  CONT1   ;If no carry,›                    ;continue on›       INC  DL4+1,X ;Carry set, so›                    ;increment hibyte›CONT1  INX›       INX›       INX          ;Add three to the›                    ;index register›       CPX  #36     ;If X=36, we have›                    ;completed all›                    ;12 lines›       BNE  LOOP1   ;If not, go back›                    ;& do the next one›       RTS          ;If so, return to›                    ;BASIC›SCRN   PLA          ;This (almost›                    ;identical) is for›                    ;negative OFS›       PLA›       PLA›       STA  OFS›       LDX  #00›LOOP2  LDA  DL4,X›       SEC          ;These two lines›                    ;are different to›                    ;allow sub-›       SBC  OFS     ;traction of OFS›       STA  DL4,X›       BCS  CONT2   ;Same for this and›                    ;following line›       DEC  DL4+1,X›CONT2  INX›        INX›       INX›       CPX  #36›       BNE  LOOP2›       RTS›››; Routine to load or save data›; callable from BASIC as follows:›; Q=USR(ADR(DF$),IOCB,CMD,ADDRESS,NUM)›; Where: IOCB is the Input/Output ›; channel being used›;  CMD is 7 for READ or 11 for WRITE›;  ADDR is the address to take data ›;       from or move data to›;  NUM is number of bytes to transfer››CIOV   EQU  $E456   ;Central Input/›                    ;Output vector›ICCOM  EQU  $0342   ;IOCB #0:›                    ; command byte›ICSTA  EQU  $0343   ; status byte›ICBAL  EQU  $0344   ; buffer address›                    ;    (lo-hi)›ICBLL  EQU  $0348   ; buffer length›                    ;    (lo-hi)›USRARG EQU  $00D4   ;Address of USR›                    ;function return›                    ;argument›››DF     PLA          ;Number of›                    ;parameters passed›                    ;by BASIC›       CMP  #04     ;Is it four as it›                    ;should be?›       BNE  ERROR   ;If No return with›                    ;variable Q=22›       PLA          ;Hibyte of IOCB›                    ;number - discard›       PLA          ;Lobyte of same›       ASL  A       ;Multiply it by 16›                    ;for ease of use›       ASL  A›       ASL  A›       ASL  A›       TAX          ;Save it for later›                    ;use in X-register›       PLA          ;Hibyte of›                    ;command - discard›       PLA          ;Lobyte of command›       STA  ICCOM,X ;Put it in com-›                    ;mand byte of›                    ;IOCB #X/16›       PLA          ;This is hibyte›                    ;of the buffer›                    ;address›       STA  ICBAL+1,X  ;Into the IOCB›                       ;you go!›       PLA          ;Lobyte of buffer›                    ;address›       STA  ICBAL,X ;goes in also›       PLA          ;Hibyte of buffer›                    ;length›       STA  ICBLL+1,X›       PLA             ;and lobyte of›                       ;same go›        STA  ICBLL,X   ;into proper›                       ;IOCB,›EXEC   JSR  CIOV    ;Now CIO will›                    ;perform the I/O›CHECK  TYA          ;Get completion›                    ;status from›                    ;Y-register›       STA  USRARG  ;And pass it back›                    ;to BASIC›       LDA  #00›       STA  USRARG+1  ;Zero-out hibyte›                      ;just in case›       RTS          ;Return to BASIC,›                    ;Q=Error number›ERROR  TAX          ;Save incorrect›                    ;# of arguments›                    ;passed›LOOP3  PLA          ;and pull them off›                    ;the stack one by›                    ;one›       PLA›       DEX›       BNE  LOOP3   ;Go do next one›                    ;if any left›       LDA  #22     ;ERROR- 22›                    ;indicates›                    ;incorrect # of›                    ;args.›       STA  USRARG  ;Let BASIC know›                    ;about it›       LDA  #00›       STA  USRARG+1  ;Make sure the›                      ;error number›                      ;is <256!›       RTS          ;BASIC regains›                    ;control,›                    ;unsatisfied›››          END› 