; 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
Back to previous page